/**

 */
grammar opExp;

@header {package wili.exp.simple.antlr;}

options {
}

/* 简单表达式
>>> 未支持：条件运算、单目运算、
>>> 已支持：等号、函数、字符串、带点名称。
>>> 语法：
    opExp: exp (op, exp)*
    exp:  ( exp ) | num | var | fun
    fun:   objName .  funName (args?)
    args:   arg (, arg)*
    op:   +-/*<>=!=

eg. z-(a+b)-c, a+b>c
*/
opExp
:
	exp	(op (exp | opExp3))* 
	| opExp3 (op opExp)*
;
opExp3: '(' opExp ')';
exp
:
	exp3
	| num
	| var
	| fun
;
exp3: '(' exp ')';
op
:
	'=='
	| '!='
	| '>='
	| '≥'
	| '<='
	| '≤'
	| '>'
	| '<'
	| '+'
	| '-'
	| '*'
	| '×'
	| '/'
	| '÷'
	| '%'
	| '^'
	| '+='
	| '-='
	| '*='
	| '/='
	| '='
;

fun
:
	dname? '(' args? ')'
;

args
:
	exp
	(
		',' exp
	)+
;

dname
:
	name
	(
		'.' name
	)*
;

name
:
	Identifier
;

var
:
	Identifier
	(
		'.' Identifier
	)*
;

num
:
	Digits
	(
		'.' Digits
	)?
;

DOT
:
	'.'
;

ASSIGN
:
	'='
;

GT
:
	'>'
;

LT
:
	'<'
;

BANG
:
	'!'
;

EQUAL
:
	'=='
;

LE
:
	'<='
;

GE
:
	'>='
;

NOTEQUAL
:
	'!='
;

AND
:
	'&&'
;

OR
:
	'||'
;

INC
:
	'++'
;

DEC
:
	'--'
;

ADD
:
	'+'
;

SUB
:
	'-'
;

MUL
:
	'*'
;

DIV
:
	'/'
;

BITAND
:
	'&'
;

BITOR
:
	'|'
;

CARET
:
	'^'
;

MOD
:
	'%'
;

COMMA
:
	','
;

Digits
:
	Digit+
;
//WS
//:
//	[ \t\n\r]+ -> skip
//;

Identifier
:
	JavaLetter JavaLetterOrDigit*
;

LPAREN
:
	'('
;

RPAREN
:
	')'
;

fragment
Digit
:
	[0-9]
;

fragment
JavaLetter
:
	[a-zA-Z]
;

fragment
JavaLetterOrDigit
:
	[a-zA-Z0-9$_] // these are the "java letters or digits" below 0x7F

;

WS
:
	[ \n\t]+ -> skip
;
